# Инструкции по очистке аудитов и журналов

Очистка аудитов и журналов выполняется через штатную задачу **Очистка таблиц** `CleanupJob` и настройки `Btk_JobCleanupSetting`.

Для части журналов в системе уже есть преднастроенная очистка в `CleanupJob`:
- **Аудит JEXL** — `aud.jexlexechistory`, настройка зарегистрирована, но по умолчанию не активна.
- **Открытие форм** — `Btk_FormSession`, настройка зарегистрирована и активна.
- **Аудит подключений к сервисам REST/SOAP/WS** — `Btk_AuditConnectService`, настройка зарегистрирована, но по умолчанию не активна.
- **Журнал пользовательских ошибок** — `Btk_ErrorAudit`, настройка зарегистрирована и активна.
- **Журнал трассировки серверных методов** — `Btk_ServerMethodIntercept`, настройка зарегистрирована и активна.

Для остальных аудитов и журналов очистку необходимо настраивать отдельно: указать таблицу или API-класс, поле даты, срок хранения и способ удаления. Если журнал имеет связанную детализацию, вложения, историю состояний или требует дополнительной бизнес-логики при удалении, лучше использовать скриптовую очистку или удаление через API, а не прямой SQL.

## Настройка очистки

Очистка аудитов и журналов выполняется через общий механизм заданий очистки данных. В настройке очистки указывается таблица или API-класс, срок хранения, поле даты, способ удаления и признак активности.

Подробное описание механизма настройки, способов удаления и регистрации настроек через код см. в разделе [Задания очистки данных](https://help.globalerp.ru/books/BtkDocumentation/SNAPSHOT/html/050_%D0%BC%D0%B5%D0%BD%D0%B5%D0%B4%D0%B6%D0%B5%D1%80_%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B9.html).

## Особенности очистки журналов

### Аудит JEXL

Аудит JEXL хранится в таблицах:
- `aud.jexlexechistory`;
- `aud.jexlexechistoryDet`.

Для очистки уже предусмотрен метод:

```scala
Btk_JexlScriptRunnerPkg.clearOldExec(npDaysKeep)
```

Штатная настройка `CleanupJob` регистрируется в `regCleanupJob()`:
- класс/таблица: `aud.jexlexechistory`;
- срок хранения: 60 дней;
- тип удаления: `DeleteType.script`;
- скрипт: `Btk_JexlScriptRunnerPkg.clearOldExec(nDaysKeep);`;
- активность: `bpActive = 0`.

Метод удаляет записи из `aud.jexlexechistory` по полю `dEndExec` и связанные строки из `aud.jexlexechistoryDet`.

```{attention}
У метода срок по умолчанию 30 дней, а у зарегистрированной настройки — 60 дней. Если очистка запускается вручную, срок лучше передавать явно.
```

### Аудит отчетов

Аудит отчетов хранится в таблице `Rpt_ReportAudit`.

Методы `Rpt_ReportAuditApi.beforeDeleteReport(...)` и `Rpt_ReportAuditApi.beforeDeleteReportVersion(...)` обслуживают ссылки при удалении отчета или версии отчета. Это не регламентная очистка по сроку хранения.

Для регламентной очистки старых записей используйте настройку `CleanupJob`:
- `spClass = "Rpt_ReportAudit"`;
- `npDeleteType = DeleteType.sqlDelete`;
- `spAttrCreateDate = "dPrint"`;
- `npDaysKeep` — по регламенту;
- `bpActive = 1`.

### Аудит подключений

Аудит подключений хранится в таблице `Btk_AuditConnect`.

Для очистки используйте настройку `CleanupJob`:
- `spClass = "Btk_AuditConnect"`;
- `npDeleteType = DeleteType.sqlDelete`;
- `spAttrCreateDate = "dDate"`;
- `npDaysKeep` — по регламенту;
- `bpActive = 1`.

Если этот журнал используется вместе с журналом подключений к REST/SOAP/WS-сервисам, сроки хранения лучше согласовать между ними.

### Аудит пользователя

Аудит пользователя не является отдельной таблицей. Это сводная витрина, реализованная в `Btk_OpenSelMonitorAvi.scala`.

Витрина собирает данные из нескольких источников:
- аудит объектов — таблицы `aud.<RootClass>_dzAud`;
- открытие форм — `Btk_FormSession`;
- подключения — `Btk_AuditConnect`;
- отчеты — `Rpt_ReportAudit`.

Для очистки аудита пользователя очищаются его источники:
1. Для вкладки по объектам — таблицы аудита данных `aud.*_dzAud`.
2. Для открытия форм — `Btk_FormSession`.
3. Для подключений — `Btk_AuditConnect`.
4. Для отчетов — `Rpt_ReportAudit`.

Для `Btk_FormSession` настройка зарегистрирована штатно:
- `spClass = "Btk_FormSession"`;
- `npDaysKeep = 60`;
- `npDeleteType = DeleteType.sqlDelete`;
- `spAttrCreateDate = "dBegin"`;
- `bpActive = 1`.

```{attention}
Если сроки хранения источников отличаются, в аудите пользователя будут видны разные исторические глубины по разным вкладкам.
```

### Аудит прав доступа

Аудит прав доступа является представлением поверх таблиц аудита данных. Логика витрины находится в `Btk_AcRightsAuditAvi.scala`.

В коде используются, в частности:
- `aud.Btk_User_dzAud` — для изменений пользовательских назначений;
- `aud.Btk_AcProfile_dzAud` — для изменений профильных назначений;
- `aud.Btk_AcRole_dzAud`;
- `aud.Btk_AcObject_dzAud`.

Если допустимо чистить весь аудит соответствующих root-классов, настройте `CleanupJob` для нужных таблиц `aud.*_dzAud` по полю `dDate`.

Если нужно удалить только историю прав доступа, а остальной аудит этих объектов оставить, используйте отдельную скриптовую настройку `DeleteType.script` или SQL с фильтром по `idClass`.

Для регламентной очистки лучше оформить такой SQL в отдельный пакетный метод и зарегистрировать его в `CleanupJob` как `DeleteType.script`.

### Журнал аудита данных

Журнал аудита данных хранит изменения бизнес-объектов в отдельных аудит-таблицах вида:

```text
aud.<RootClass>_dzAud
```

Очистка настраивается отдельно для каждой нужной таблицы аудита.

Рекомендуемая настройка:
- `spClass = "aud.<RootClass>_dzAud"`;
- `npDeleteType = DeleteType.sqlDelete`;
- `spAttrCreateDate = "dDate"`;
- `npDaysKeep` — по регламенту;
- `bpActive = 1`.

### Журнал аудита подключений к сервисам REST/SOAP/WS

Журнал хранится в таблице `Btk_AuditConnectService`.

Штатная регистрация очистки уже предусмотрена:
- `spClass = "Btk_AuditConnectService"`;
- `npDaysKeep = 30`;
- `npDeleteType = DeleteType.sqlDelete`;
- `bpActive = 0`.

Поле даты явно не задано, поэтому используется значение по умолчанию `dCreateDate_dz`.

В ODM у журнала есть фактическая дата подключения `dConnect` и индекс по `dConnect`. Если регламент должен считать срок хранения от фактической даты подключения, в настройке нужно указать поле `dConnect`.

### Журнал входящих HTTP-запросов

Журнал входящих HTTP-запросов хранится в таблице `Bts_HttpInRequest`.

Очистка выполняется через настройку `CleanupJob`.

Рекомендуемая настройка:
- `spClass = "Bts_HttpInRequest"`;
- `npDeleteType = `DeleteType.sqlDelete`;
- `spAttrCreateDate = "dCreateDate_dz"`;
- `npDaysKeep` — по регламенту;
- `bpActive = 1`.

### Журнал пользовательских ошибок

Журнал пользовательских ошибок хранится в таблице `aud.btk_errorAudit`.

Очистка выполняется готовым методом:

```scala
Btk_ErrorAuditPkg.clearOld(npDaysKeep)
```

Штатная настройка `CleanupJob` уже зарегистрирована и активна:
- `spClass = "Btk_ErrorAudit"`;
- `npDaysKeep = 30`;
- `npDeleteType = DeleteType.script`;
- `spAttrCreateDate = ""`;
- скрипт: `Btk_ErrorAuditPkg.clearOld(nDaysKeep);`;
- `bpActive = 1`.

```{attention}
Очистка сравнивает `DATE(dDate)`, то есть работает по календарной дате, а не по точному времени события.
```

### Журнал построения отчетов

Журнал построения отчетов хранится в таблице `Rpt_EntityExec`.

В системе есть штатная задача:

```scala
Rpt_ClearStuckReports
```

Она запускает:

```scala
Rpt_EntityPkg.clearForSchedulePrinting();
```

Эта задача не удаляет старый журнал построения отчетов. Она прерывает фоновые и регламентные отчеты, которые зависли больше чем на 24 часа: переводит их в состояние ошибки и чистит связанные `Btk_JobEvent` и `Btk_BackgroundTaskJournal`.

Для удаления записей `Rpt_EntityExec` используется метод:

```scala
Rpt_EntityApi.deleteEntityExecByChunk(rop)
```

При удалении одной записи `Rpt_EntityExec` через API удаляются вложения, история состояний и ручные коллекции. Поэтому для регламентной очистки старых записей лучше использовать `DeleteType.apiDelete`, а не прямой SQL.

Рекомендуемая настройка:
- `spClass = "Rpt_EntityExec"`;
- `npDeleteType = DeleteType.apiDelete`;
- `spAttrCreateDate = "dCreate"`;
- `npDaysKeep` — по регламенту;
- `bpActive = 1`.

Перед включением желательно проверить выборку старых записей и при необходимости ограничить очистку завершенными или ошибочными состояниями через отдельный скриптовый метод. Базовый `CleanupJob` удаляет только по дате и не добавляет фильтр по состоянию.

### Журнал трассировки серверных методов

Журнал трассировки серверных методов хранит данные сессий трассировки, вызовов методов и SQL-запросов.

Данные размещаются в таблицах:
- `btk_servermethodintercept`;
- `btk_servermethodinterceptdet`;
- `Btk_ServerMethodInterceptDetSQL`.

Очистка выполняется готовым методом:

```scala
Btk_ServerMethodInterceptPkg.clearOld()
```

Штатная настройка `CleanupJob` уже зарегистрирована и активна:
- `spClass = "Btk_ServerMethodIntercept"`;
- `npDaysKeep = 30`;
- `npDeleteType = DeleteType.script`;
- `spAttrCreateDate = ""`;
- скрипт: `Btk_ServerMethodInterceptPkg.clearOld();`;
- `bpActive = 1`.

Detail-таблицы связаны с master-таблицей внешними ключами `ON DELETE CASCADE`, поэтому при удалении master-записей детали удаляются каскадно.

```{attention}
Текущий метод жестко хранит 30 дней и не принимает `nDaysKeep`. Изменение `nDaysKeep` в настройке `CleanupJob` не изменит срок хранения. Чтобы сделать срок настраиваемым, нужно изменить метод `clearOld` или зарегистрировать другой скрипт очистки.
```